package com.lyp.supermanage.utils;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.DialogInterface;
import android.content.DialogInterface.OnCancelListener;
import android.os.Handler;
import android.os.Looper;
import android.os.SystemClock;
import android.widget.TextView;

import com.blankj.utilcode.util.KeyboardUtils;
import com.blankj.utilcode.util.StringUtils;
import com.blankj.utilcode.util.ToastUtils;
import com.lyp.supermanage.R;

/**
 * 进度对话框(ProgressDialog)工具类
 *
 * @author lzh
 */
public class ProgressDialogUtils {
    private static ProgressDialogUtils mInstance;
    private static ProgressDialog mDialog;
    private static Handler sHandler = new Handler(Looper.getMainLooper());

    private ProgressDialogUtils() {
    }

    public static ProgressDialogUtils getInstance() {
        if (mInstance == null) {
            mInstance = new ProgressDialogUtils();
        }
        return mInstance;
    }

    public ProgressDialogUtils builder(Activity activity) {
        // 动态隐藏软键盘(因为有可能上个界面键盘没有关闭就直接进入了当前界面,用户体验不是很好)
        KeyboardUtils.hideSoftInput(activity);
        // 实例化 ProgressDialog
        mDialog = new ProgressDialog(activity, R.style.Dialog_Transparent); // 参数二引用了对话框背景透明的主题
        // 设置是否可以通过点击Back键取消 (点击Dialog外会取消Dialog进度条 )
        mDialog.setCancelable(true);
        // 设置在点击 Dialog 外是否取消 Dialog 进度条
        mDialog.setCanceledOnTouchOutside(false);
        return mInstance;
    }

    public ProgressDialogUtils setCancelable(boolean isCancelable) {
        // 设置是否可以通过点击Back键取消 (点击Dialog外会取消Dialog进度条 )
        mDialog.setCancelable(isCancelable);
        return mInstance;
    }

    public ProgressDialogUtils setCanceledOnTouchOutside(boolean isCanceledOnTouchOutside) {
        // 设置在点击Dialog外是否取消Dialog进度条
        mDialog.setCanceledOnTouchOutside(isCanceledOnTouchOutside);
        return mInstance;
    }

    public ProgressDialogUtils setCanCelMessage(final String canCelMessage) {
        // 设置手动取消进度对话框的回调监听
        mDialog.setOnCancelListener(new OnCancelListener() {
            @Override
            public void onCancel(DialogInterface dialog) {
                // TODO Auto-generated method stub
                // 手动取消对话框的提示信息不为空
                if (!StringUtils.isEmpty(canCelMessage)) {
                    ToastUtils.showShortSafe(canCelMessage);
                }
            }
        });
        return mInstance;
    }

    /**
     * 显示进度对话框
     */
    public void show(String loadMessage) {
        // 显示进度对话框
        mDialog.show();
        // 设置自定义布局
        mDialog.setContentView(R.layout.app_loading_dialog); // setContentView() 方法需在 show() 方法之后调用,不然会报错
        // 获取自定义布局中的 TextView
        TextView textView = (TextView) mDialog.findViewById(R.id.app_loading_dialog_tv);
        // 判断 TextView 中的文本值是否为空
        if (StringUtils.isEmpty(loadMessage)) {
            textView.setText("请稍候...");
        } else {
            textView.setText(loadMessage);
        }
    }

    /**
     * 设置超时时间,多少秒后自动关闭对话框
     * ps:在 show() 方法之后调用
     *
     * 注意注意注意:
     * 先暂停使用,待优化
     * why?
     * ①.多次调用会造成开启多个线程
     * ②.多次开启时可能对话框刚 show 的时候 就碰到某个线程刚好 dismiss 对话框
     *
     * @param  ms  超时时间
     */
    public ProgressDialogUtils setTimeOut(final long ms) {
        // 设置超时时间,5 秒后自动关闭对话框
        new Thread(new Runnable() {
            @Override
            public void run() {
                SystemClock.sleep(ms);
                sHandler.post(new Runnable() {
                    @Override
                    public void run() {
                        mInstance.dismiss();
                        //ToastUtils.showShortToast("请求超时");
                    }
                });
            }
        }).start();
        return mInstance;
    }

    private boolean isShowing() {
        return mDialog != null && mDialog.isShowing();
    }

    /**
     * 关闭进度对话框(cancel:会触发对应的回调方法)
     */
    public void cancel() {
        if (isShowing()) {
            //关闭对话框
            mDialog.cancel();
        }
    }

    /**
     * 关闭进度对话框(dismiss:也会触发对应的回调方法)
     */
    public void dismiss() {
        if (isShowing()) {
            //关闭对话框
            mDialog.dismiss();
        }
    }
}
